<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 二分查找，也称为折半查找，是指在有序的数组里找出指定的值，返回该值在数组中的索引。

      // 查找步骤如下：

      // 1.从有序数组的最中间元素开始查找，如果该元素正好是指定查找的值，则查找过程结束。否则进行下一步;
      // 2.如果指定要查找的元素大于或者小于中间元素，则在数组大于或小于中间元素的那一半区域查找，然后重复第一步的操作;
      // 3.重复以上过程，直到找到目标元素的索引，查找成功;或者直到子数组为空，查找失败。
      // 优点
      // 比较次数少，查找速度快，平均性能好； 其缺点是要求待查表为有序表，且插入删除困难。因此，折半查找方法适用于不经常变动而查找频繁的有序列表。

      function search(list, target) {
        //初始索引
        let startIndex = 0;
        //末尾索引
        let endIndex = list.length - 1;
        // 使用while循环
        //一直循环  直到start>end就退出循环
        while (startIndex <= endIndex) {
          //中间索引
          let middleIndex = parseInt((endIndex + startIndex) / 2);
          if (target === list[middleIndex]) {
            return middleIndex; //如果start和middle相等，说明找到了，返回middle
          } else if (target < list[middleIndex]) {
            // 在左边
            endIndex = middleIndex - 1;
          } else if (target > list[middleIndex]) {
            // 在右边
            startIndex = middleIndex + 1;
          }
        }
        return -1;
      }

      let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
      console.log(search(arr, 5)); //output=> 2
    </script>
  </body>
</html>
